package Servlet;

import DAO.DAOPessoa;
import Model.BeanConserto;
import Model.BeanEstado;
import Model.BeanFuncionario;
import Model.BeanPessoa;
import Model.BeanProduto;
import Model.EnumTipoFuncionario;
import Util.Util;
import static Util.Util.DataNula;
import static Util.Util.DataMaxima;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author ebastos
 */
@WebServlet(name = "controladora", urlPatterns = {"/controladora"})
public class Controladora extends HttpServlet {

    //variaveis globais
    DAOPessoa daoPessoa;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            response.setContentType("text/html;charset=UTF-8");
            String acao = request.getParameter("action");
            if (acao == null || (acao.isEmpty())) {
                throw new Exception("Nenhuma ação informada.");
            }

            switch (acao) {
                case "Login":
                    String btnLogin = request.getParameter("btnLogin");
                    String btnEsqueceuSenha = request.getParameter("btnEsqueceuSenha");
                    if (btnLogin != null && btnLogin.equals("Login")) {
                        int matricula;
                        try {
                            matricula = Integer.parseInt(request.getParameter("txtMatricula"));
                        } catch (NumberFormatException e) {
                            throw new Exception("Matrícula é apenas números.");
                        }
                        String senha = request.getParameter("txtSenha");
                        if (senha.isEmpty()) {
                            throw new Exception("Senha não informada.");
                        }
                        //Retorna o usuário que está se logando
                        BeanFuncionario funcionario = new BeanFuncionario(matricula, senha);
                        if (funcionario.getCPF() == 0) {
                            throw new Exception("Matrícula ou senha incorreta.");
                        }
                        //Salvo o usuário logado na sessão.
                        request.getSession().setAttribute("funcionario", funcionario);
                        if (funcionario.getTipofuncionario() == EnumTipoFuncionario.FUNCIONARIO) {
                            request.getSession().setAttribute("titulo", "Lista de Pedidos");
                            request.getSession().setAttribute("pagina", "/PEDIDO/lista_pedido.jsp");
                        } else {
                            request.setAttribute("dtIni", new Date(new Date().getTime() - (7 * 24 * 3600000)));
                            request.setAttribute("dtFim", new Date());
                            request.getSession().setAttribute("titulo", "Informações Gerenciais");
                            request.getSession().setAttribute("pagina", "/PEDIDO/gerente.jsp");
                        }
                    }
                    if (btnEsqueceuSenha != null && btnEsqueceuSenha.equals("Esqueceu a senha?")) {
                        int matricula;
                        try {
                            matricula = Integer.parseInt(request.getParameter("txtMatricula"));
                        } catch (NumberFormatException e) {
                            throw new Exception("Matrícula é apenas números.");
                        }
                        //Retorna o usuário que esqueceu a senha
                        BeanFuncionario funcionario = new BeanFuncionario(matricula);
                        if (funcionario.getCPF() == 0) {
                            throw new Exception("Nenhum funcionário com a matrícula informada.");
                        }
                    //Envia e-mail
                        //Send("dac.ufpr.trabalho@gmail.com", "dacufprasdasd123123", "etortato@gmail.com", "", "Título teste", "Corpo teste...");

                        //Redireciona para a página do aviso
                        RequestDispatcher rd = request.getRequestDispatcher("./HOME/LOGIN/esqueceu_senha.html");
                        rd.forward(request, response);
                        return;
                    }
                    break;
                case "Logout":
                    request.getSession().removeAttribute("funcionario");
                    request.getSession().setAttribute("titulo", "NãoTemBook");
                    request.getSession().removeAttribute("pagina");
                    break;
                case "ListaPedidos":
                    ListaPedidos(request);
                    break;
                case "ListaDePedidos":
                    String btnVisualizarPedido = request.getParameter("btnVisualizar");
                    if (btnVisualizarPedido != null && !btnVisualizarPedido.isEmpty()) {
                        request.setAttribute("pedido", new BeanConserto(Integer.parseInt(btnVisualizarPedido)));
                        request.getSession().setAttribute("titulo", "Visualizar Pedido");
                        request.getSession().setAttribute("pagina", "/PEDIDO/visualizar_pedido.jsp");
                    }

                    String btnEditarPedido = request.getParameter("btnEditar");
                    if (btnEditarPedido != null && !btnEditarPedido.isEmpty()) {
                        request.setAttribute("pedido", new BeanConserto(Integer.parseInt(btnEditarPedido)));
                        request.getSession().setAttribute("titulo", "Editar Pedido");
                        request.getSession().setAttribute("pagina", "/PEDIDO/editar_pedido.jsp");
                    }

                    break;
                case "EditarPedido":
                    String btnEditarVoltar = request.getParameter("btnVoltar");
                    if (btnEditarVoltar != null && btnEditarVoltar.equals("Voltar")) {
                        ListaPedidos(request);
                    }

                    String btnEditarSalvar = request.getParameter("btnSalvar");
                    if (btnEditarSalvar != null && btnEditarSalvar.equals("Salvar")) {
                        int ID = Integer.parseInt(request.getParameter("txtID"));
                        String txtClienteCadastrarPedido = request.getParameter("txtCliente");
                        if (txtClienteCadastrarPedido == null || txtClienteCadastrarPedido.isEmpty()) {
                            throw new Exception("É obrigatório informar um cliente para o conserto.");
                        }
                        String txtProdutoCadastrarPedido = request.getParameter("txtProduto");
                        if (txtProdutoCadastrarPedido == null || txtProdutoCadastrarPedido.isEmpty()) {
                            throw new Exception("É obrigatório informar um produto para o conserto.");
                        }
                        String txtDataAberturaCadastrarPedido = request.getParameter("txtDataAbertura");
                        if (txtDataAberturaCadastrarPedido == null || txtDataAberturaCadastrarPedido.isEmpty()) {
                            throw new Exception("É obrigatório informar uma data de abertura para o pedido.");
                        }
                        String txtDataPrevisaoCadastrarPedido = request.getParameter("txtDataPrevisao");
                        if (txtDataPrevisaoCadastrarPedido == null || txtDataPrevisaoCadastrarPedido.isEmpty()) {
                            throw new Exception("É obrigatório informar uma data de previsão de retirada para o pedido.");
                        }
                        String txtDataRetiradaPedido = request.getParameter("txtDataRetirada");
                        String txtDataConsertoPedido = request.getParameter("txtDataConserto");
                        String txtValorCadastrarPedido = request.getParameter("txtValor");
                        if (txtValorCadastrarPedido == null || txtValorCadastrarPedido.isEmpty()) {
                            throw new Exception("É obrigatório informar um valor para o conserto.");
                        }
                        String txtProblemaCadastrarPedido = request.getParameter("txtProblema");
                        if (txtProblemaCadastrarPedido == null || txtProblemaCadastrarPedido.isEmpty()) {
                            throw new Exception("É obrigatório informar um problema para o conserto.");
                        }
                        String txtDescricaoCadastrarPedido = request.getParameter("txtDescricao");
                        BeanPessoa pessoaCadastrarPedido = new BeanPessoa(txtClienteCadastrarPedido);
                        if (pessoaCadastrarPedido == null || pessoaCadastrarPedido.getCPF() == 0) {
                            throw new Exception("Nenhum cliente encontrado com o nome informado.");
                        }
                        BeanProduto produtoCadastrarPedido = new BeanProduto(txtProdutoCadastrarPedido);
                        if (produtoCadastrarPedido == null || produtoCadastrarPedido.getID() == 0) {
                            throw new Exception("Nenhum produto encontrado com o nome informado.");
                        }
                        BeanConserto novoConserto = new BeanConserto();
                        Date dataAberturaCadastrarPedido = Util.TextoParaData(txtDataAberturaCadastrarPedido);
                        Date dataPrevisaoCadastrarPedido = Util.TextoParaData(txtDataPrevisaoCadastrarPedido);
                        Date dataRetiradaCadastrarPedido = null;
                        if (txtDataRetiradaPedido == null || txtDataRetiradaPedido.isEmpty()) {
                            dataRetiradaCadastrarPedido = Util.DataNula;
                        } else {
                            dataRetiradaCadastrarPedido = Util.TextoParaData(txtDataRetiradaPedido);
                        }
                        Date dataConsertoCadastrarPedido = null;
                        if (txtDataConsertoPedido == null || txtDataConsertoPedido.isEmpty()) {
                            dataConsertoCadastrarPedido = Util.DataNula;
                        } else {
                            dataConsertoCadastrarPedido = Util.TextoParaData(txtDataConsertoPedido);
                        }
                        float valorCadastrarPedido = Float.valueOf(txtValorCadastrarPedido.replace(".", "").replace(",", "."));
                        BeanFuncionario funcionarioCadastrarPedido = (BeanFuncionario) request.getSession().getAttribute("funcionario");
                        novoConserto.Salvar(ID, produtoCadastrarPedido.getID(), funcionarioCadastrarPedido.getMATRICULA(), pessoaCadastrarPedido.getCPF(), dataAberturaCadastrarPedido, dataPrevisaoCadastrarPedido, dataRetiradaCadastrarPedido, valorCadastrarPedido, txtProblemaCadastrarPedido, txtDescricaoCadastrarPedido, dataConsertoCadastrarPedido);
                        ListaPedidos(request);
                    }

                    break;
                case "VisualizarPedido":
                    ListaPedidos(request);
                    break;
                case "Gerente":
                    BeanConserto conserto = new BeanConserto();
                    String btnAtrasados = request.getParameter("btnAtrasados");
                    Date dataAtual = new Date();
                    Date semanaPassada = new Date(new Date().getTime() - (7 * 24 * 3600000));
                    if (btnAtrasados != null && btnAtrasados.equals("Atrasados")) {
                        request.setAttribute("Atrasados", "Atrasados");
                        request.setAttribute("ListaPedidos", conserto.ListaConsertos(true, false, false));
                    }
                    String btnAbertos = request.getParameter("btnAbertos");
                    if (btnAbertos != null && btnAbertos.equals("Abertos")) {
                        request.setAttribute("Abertos", "Abertos");
                        request.setAttribute("ListaPedidos", conserto.ListaConsertos(false, true, false));
                    }
                    String btnNovos = request.getParameter("btnNovos");
                    if (btnNovos != null && btnNovos.equals("Novos")) {
                        request.setAttribute("DataInicial", Util.FormataDataTela(semanaPassada));
                        request.setAttribute("DataFinal", Util.FormataDataTela(dataAtual));
                        request.setAttribute("ListaPedidos", conserto.ListaConsertos(dataAtual, semanaPassada, false, false, false));
                    }
                    String btnConcluidos = request.getParameter("btnConcluidos");
                    if (btnConcluidos != null && btnConcluidos.equals("Concluidos")) {
                        request.setAttribute("Concluidos", "Concluidos");
                        request.setAttribute("ListaPedidos", conserto.ListaConsertos(false, false, true));
                    }
                    request.getSession().setAttribute("titulo", "Lista de Pedidos");
                    request.getSession().setAttribute("pagina", "/PEDIDO/lista_pedido.jsp");
                    break;
                case "ListaClientes":
                    /* BeanConserto conserto = new BeanConserto();
                     String btnAtrasados = request.getParameter("btnAtrasados");
                     Date dataAtual = new Date();
                     Date semanaPassada = new Date(new Date().getTime() - (7 * 24 * 3600000));
                     if (btnAtrasados != null && btnAtrasados.equals("Atrasados")) {
                     request.setAttribute("Atrasados", "Atrasados");
                     request.setAttribute("ListaPedidos", conserto.ListaConsertos(null, null, "", "", true, false, false));
                     }
                     String btnAbertos = request.getParameter("btnAbertos");
                     if (btnAbertos != null && btnAbertos.equals("Abertos")) {
                     request.setAttribute("Abertos", "Abertos");
                     request.setAttribute("ListaPedidos", conserto.ListaConsertos(null, null, "", "", false, true, false));
                     }
                     String btnNovos = request.getParameter("btnNovos");
                     if (btnNovos != null && btnNovos.equals("Novos")) {
                     request.setAttribute("DataInicial", Util.FormataDataTela(semanaPassada));
                     request.setAttribute("DataFinal", Util.FormataDataTela(dataAtual));
                     request.setAttribute("ListaPedidos", conserto.ListaConsertos(dataAtual, semanaPassada, "", "", false, false, false));
                     }
                     String btnConcluidos = request.getParameter("btnConcluidos");
                     if (btnConcluidos != null && btnConcluidos.equals("Concluidos")) {
                     request.setAttribute("Concluidos", "Concluidos");
                     request.setAttribute("ListaPedidos", conserto.ListaConsertos(null, null, "", "", false, false, true));
                     }*/
                    request.getSession().setAttribute("titulo", "Lista de Clientes");
                    request.getSession().setAttribute("pagina", "/CLIENTE/lista_cliente.jsp");
                    break;
                case "FiltroListaPedidos":
                    String btnFiltrarListaPedidos = request.getParameter("btnFiltrarListaPedidos");
                    if (btnFiltrarListaPedidos != null && btnFiltrarListaPedidos.equals("Filtrar")) {
                        String txtDataInicial = request.getParameter("txtDataInicialListaPedidos");
                        Date dataInicial = DataNula;
                        if (txtDataInicial != null && !txtDataInicial.isEmpty()) {
                            request.setAttribute("DataInicial", txtDataInicial);
                            dataInicial = Util.TextoParaData(txtDataInicial);
                        }
                        String txtDataFinal = request.getParameter("txtDataFinalListaPedidos");
                        Date dataFinal = DataMaxima;
                        if (txtDataFinal != null && !txtDataFinal.isEmpty()) {
                            request.setAttribute("DataFinal", txtDataFinal);
                            dataFinal = Util.TextoParaData(txtDataFinal);
                        }
                        String chkAbertos = request.getParameter("chkAbertosListaPedidos");
                        Boolean abertos = false;
                        if (chkAbertos != null && !chkAbertos.isEmpty()) {
                            request.setAttribute("Abertos", "Abertos");
                            abertos = true;
                        }
                        String chkFinalizados = request.getParameter("chkFinalizadosListaPedidos");
                        Boolean finalizados = false;
                        if (chkFinalizados != null && !chkFinalizados.isEmpty()) {
                            request.setAttribute("Concluidos", "Concluidos");
                            finalizados = true;
                        }
                        String chkAtrasados = request.getParameter("chkAtrasadosListaPedidos");
                        Boolean atrasados = false;
                        if (chkAtrasados != null && !chkAtrasados.isEmpty()) {
                            request.setAttribute("Atrasados", "Atrasados");
                            atrasados = true;
                        }
                        String txtProduto = request.getParameter("txtProdutoListaPedidos");
                        String txtCliente = request.getParameter("txtClienteListaPedidos");
                        BeanConserto consertoListaPedidos = new BeanConserto();
                        request.setAttribute("ListaPedidos", consertoListaPedidos.ListaConsertos(dataInicial, dataFinal, txtProduto, txtCliente, atrasados, abertos, finalizados));
                        request.getSession().setAttribute("titulo", "Lista de Pedidos");
                        request.getSession().setAttribute("pagina", "/PEDIDO/lista_pedido.jsp");
                    }
                    break;
                case "FiltroListaClientes":

                    //pega valores filtro
                    String filtroCPF = request.getParameter("txtFiltroCPF");
                    String filtroNome = request.getParameter("txtFiltroNome");

                    //como vamos recarregar a pagina, seta o texto do filtro que foi usado para mostrar os resultados
                    request.getSession().setAttribute("filtroCPFCliente", filtroCPF);
                    request.getSession().setAttribute("filtroNomeCliente", filtroNome);
                    request.getSession().setAttribute("pagina", "/CLIENTE/lista_cliente.jsp");

                    //pede ao banco a lista
                    daoPessoa = new DAOPessoa();
                    ArrayList<BeanPessoa> listaPessoas = daoPessoa.getPessoas();

                    //retorna
                    request.setAttribute("ListaClientes", listaPessoas);

                    break;
                case "ListarCadastrarPedido":
                    String btnVoltarCadastrarPedido = request.getParameter("btnCadastrar");
                    if (btnVoltarCadastrarPedido != null && btnVoltarCadastrarPedido.equals("Novo Pedido")) {
                        request.getSession().setAttribute("titulo", "Cadastrar novo pedido");
                        request.getSession().setAttribute("pagina", "/PEDIDO/cadastro_pedido.jsp");
                    }
                    break;
                case "CadastrarPedido":
                    String btnListarCadastrarPedido = request.getParameter("btnCadastrar");
                    if (btnListarCadastrarPedido != null && btnListarCadastrarPedido.equals("Voltar")) {
                        ListaPedidos(request);
                    }

                    String btnCadastrarPedido = request.getParameter("btnSalvar");
                    if (btnCadastrarPedido != null && btnCadastrarPedido.equals("Salvar")) {
                        String txtClienteCadastrarPedido = request.getParameter("txtCliente");
                        if (txtClienteCadastrarPedido == null || txtClienteCadastrarPedido.isEmpty()) {
                            throw new Exception("É obrigatório informar um cliente para o conserto.");
                        }
                        String txtProdutoCadastrarPedido = request.getParameter("txtProduto");
                        if (txtProdutoCadastrarPedido == null || txtProdutoCadastrarPedido.isEmpty()) {
                            throw new Exception("É obrigatório informar um produto para o conserto.");
                        }
                        String txtDataAberturaCadastrarPedido = request.getParameter("txtDataAbertura");
                        String txtDataPrevisaoCadastrarPedido = request.getParameter("txtDataPrevisao");
                        String txtValorCadastrarPedido = request.getParameter("txtValor");
                        if (txtValorCadastrarPedido == null || txtValorCadastrarPedido.isEmpty()) {
                            throw new Exception("É obrigatório informar um valor para o conserto.");
                        }
                        String txtProblemaCadastrarPedido = request.getParameter("txtProblema");
                        if (txtProblemaCadastrarPedido == null || txtProblemaCadastrarPedido.isEmpty()) {
                            throw new Exception("É obrigatório informar um problema para o conserto.");
                        }
                        String txtDescricaoCadastrarPedido = request.getParameter("txtDescricao");
                        BeanPessoa pessoaCadastrarPedido = new BeanPessoa(txtClienteCadastrarPedido);
                        if (pessoaCadastrarPedido == null || pessoaCadastrarPedido.getCPF() == 0) {
                            throw new Exception("Nenhum cliente encontrado com o nome informado.");
                        }
                        BeanProduto produtoCadastrarPedido = new BeanProduto(txtProdutoCadastrarPedido);
                        if (produtoCadastrarPedido == null || produtoCadastrarPedido.getID() == 0) {
                            throw new Exception("Nenhum produto encontrado com o nome informado.");
                        }
                        BeanConserto novoConserto = new BeanConserto();
                        Date dataAberturaCadastrarPedido = Util.TextoParaData(txtDataAberturaCadastrarPedido);
                        Date dataPrevisaoCadastrarPedido = Util.TextoParaData(txtDataPrevisaoCadastrarPedido);
                        float valorCadastrarPedido = Float.valueOf(txtValorCadastrarPedido.replace(".", "").replace(",", "."));
                        BeanFuncionario funcionarioCadastrarPedido = (BeanFuncionario) request.getSession().getAttribute("funcionario");
                        novoConserto.Salvar(0, produtoCadastrarPedido.getID(), funcionarioCadastrarPedido.getMATRICULA(), pessoaCadastrarPedido.getCPF(), dataAberturaCadastrarPedido, dataPrevisaoCadastrarPedido, DataNula, valorCadastrarPedido, txtProblemaCadastrarPedido, txtDescricaoCadastrarPedido, DataNula);
                        ListaPedidos(request);
                    }

                    break;
                case "CadastrarCliente":

                    request.getSession().setAttribute("titulo", "Novo Cliente");
                    request.getSession().setAttribute("pagina", "/CLIENTE/cadastro_cliente.jsp");

                    break;
                case "FimCadastroCliente":

                    request.getSession().setAttribute("titulo", "Lista de Clientes");
                    request.getSession().setAttribute("pagina", "/CLIENTE/lista_cliente.jsp");

                    //botao salvar apertado
                    if (request.getParameter("btnSalvar") != null) {

                        //salvar
                        String txtNome = request.getParameter("txtNome");
                        String txtCPF = request.getParameter("txtCPF");
                        String txtNascimento = request.getParameter("txtNascimento");
                        String txtSexo = request.getParameter("txtSexo");
                        String logradouro = request.getParameter("txtRua");
                        String txtNumero = request.getParameter("txtNumero");
                        String txtCidade = request.getParameter("txtCidade");
                        String txtUF = request.getParameter("txtUF");
                        String txtEmail = request.getParameter("txtEmail");
                        String txtCep = request.getParameter("txtCep");
                        String txtBairro = request.getParameter("txtBairro");

                        //cria bean
                        BeanPessoa cliente = new BeanPessoa();
                        cliente.setCPF(Integer.valueOf(txtCPF));
                        cliente.setEstado(new BeanEstado(Integer.valueOf(txtUF))); //aqui passa o id estado
                        cliente.setNome(txtNome);
                        cliente.setSexo(Boolean.valueOf(txtSexo));
                        cliente.setDtnascimento(Util.TextoParaData(txtNascimento));
                        cliente.setEmail(txtEmail);
                        cliente.setCidade(txtCidade);
                        cliente.setLogradouro(logradouro);
                        cliente.setNumero(Integer.valueOf(txtNumero));
                        cliente.setCep(txtCep);
                        cliente.setBairro(txtBairro);

                        //salva no bd
                        daoPessoa = new DAOPessoa();
                        daoPessoa.Inserir(cliente);

                        //alerta de sucesso
                        request.getSession().setAttribute("status", "sucesso");

                    } else if (request.getParameter("btnVoltar") != null) //somente voltar
                    {
                        request.getSession().setAttribute("status", "voltar");
                    }

                    break;

                case "VisualizarCliente":

                    //pega chave primaria
                    Long idCliente = Long.valueOf(request.getParameter("idCliente"));

                    //cria bean
                    BeanPessoa cliente = new BeanPessoa(idCliente);
                    request.setAttribute("cliente", cliente);
                    
                    request.getSession().setAttribute("titulo", "Visualizar Cliente");
                    request.getSession().setAttribute("pagina", "/CLIENTE/visualizar_cliente.jsp");

                    break;
                default:
                    throw new Exception("Ação informada não reconhecida.");
            }
            RequestDispatcher rd = request.getRequestDispatcher("./HOME/home.jsp");
            rd.forward(request, response);
        } catch (Exception e) {
            RequestDispatcher rd = request.getRequestDispatcher("./ERRO/erro.jsp");
            request.setAttribute("erro", e.getMessage());
            rd.forward(request, response);
        }

    }

    private void ListaPedidos(HttpServletRequest request) throws SQLException {
        BeanConserto listaconserto = new BeanConserto();
        request.setAttribute("ListaPedidos", listaconserto.ListaConsertos());
        request.getSession().setAttribute("titulo", "Lista de Pedidos");
        request.getSession().setAttribute("pagina", "/PEDIDO/lista_pedido.jsp");
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}
